#include "head.h"

status_t st;

bool sql_select(const char *sql_buf, client_status *user);

bool my_cd(sendMsg msg, client_status *user, int net_fd) {
    printf("用户发过来的cd地址信息：%s\n", msg.msg);
    if (strncmp(msg.msg, "..", 2) == 0) {
        // 处理 "cd .." 逻辑
        char buf[8000] = {0};

        printf("当前路径：%s\n", user->path);
        if (user->path[0] == '\0') {
            // 返回错误信息
            recvMsg err_msg;
            strcpy(err_msg.statu, "error");
            send(net_fd, &err_msg, sizeof(err_msg), 0);
            return false;
        } else {
            // 构建相对路径
            snprintf(buf, sizeof(buf), "%s", user->path);
              
            // 处理 ".." 逻辑
            int len = strlen(buf);
            char sql_buf[10000]={0};

        
                // 去掉末尾的 '/'
                if (buf[len - 1] == '/') {
                    buf[--len] = '\0';
                }
                char *last_slash = strrchr(buf, '/');

                // 找到最后一个 '/'
                 if (last_slash == NULL) {
                    // 如果没有找到 '/'，更新 sql_buf 为 "/"
                    bzero(buf,sizeof(buf));
                    strcpy(sql_buf, "/");
                } else {
                    // 截断路径到最后一个 '/' 之前
                    *last_slash = '\0';
                        // 更新 sql_buf 为 "/加上buf的内容"
                        snprintf(sql_buf, sizeof(sql_buf), "%s", buf);
                        if(!strlen(sql_buf)) strcpy(sql_buf, "/");
                        // 更新 buf 为 前面的内容加上 "/"
                        //strcat(buf, "/");
                    }
            printf("当前路径：%s\n", buf);
            printf("SQL查询路径：%s\n", sql_buf);

            // 执行SQL查询
            bool val = sql_select(sql_buf, user);
            if (val) {
                recvMsg success_msg;
                strcpy(user->path, buf);
                printf("服务器的路径：%s\n", user->path);
                strcpy(success_msg.msg, buf);
                strcpy(success_msg.statu, "true");
                send(net_fd, &success_msg, sizeof(success_msg), 0);
            } else {
                recvMsg err_msg;
                strcpy(err_msg.statu, "error");
                send(net_fd, &err_msg, sizeof(err_msg), 0);
                return false;
            }
        }
    } else {
        // 处理正常路径变化逻辑
        char buf[8000] = {0};
        snprintf(buf, sizeof(buf), "%s%s", user->path, msg.msg);
        printf("用户名：%s\n", user->user_name);
        printf("相对路径：%s\n", buf);

        // 构建SQL查询字符串
        char sql_buf[2048] = {0};
        strcpy(sql_buf,buf);
        size_t len = strlen(buf);
        if (len > 0 && buf[len - 1] == '/') {
            len--; // 忽略最后一个 '/'
        }
        snprintf(sql_buf, sizeof(sql_buf), "%.*s", (int)len, buf);
         printf("sqlbuf:%s\n", sql_buf);
        // 调用sql_select函数检查路径
        if (!sql_select(sql_buf, user)) {
            // 返回错误信息
            recvMsg err_msg;
            strcpy(err_msg.statu, "error");
            send(net_fd, &err_msg, sizeof(err_msg), 0);
            return false;
        }
        
        // 更新路径
        strcat(user->path, msg.msg);
        printf("用户当前路径：%s\n", user->path);

        // 返回成功信息
        recvMsg success_msg;
        strcpy(success_msg.msg, user->path);
        strcpy(success_msg.statu, "true");
        send(net_fd, &success_msg, sizeof(success_msg), 0);

        printf("发送的当前路径：%s\n", success_msg.msg);
    }
    return true;
}

bool sql_select(const char *sql_buf, client_status *user) {
    MYSQL *conn = user->sql;
    MYSQL_RES *result;

    // 初始化锁
    pthread_mutex_init(&st.lock, NULL);
    pthread_mutex_lock(&st.lock);

    // 构建SQL查询字符串
    char sql_query[1024];
    printf("sqlbuf：%s\n", sql_buf);
    snprintf(sql_query, sizeof(sql_query),
             "SELECT files.path FROM files "
             "INNER JOIN user ON files.uid = user.uid "
             "WHERE  user.uid='%s'AND files.file_type = 1 AND files.path = '%s'",
             user->user_id,sql_buf);
    printf("sql_query；%s\n",sql_query);
    // 执行查询
    mysql_query(conn, sql_query);
        printf("--------\n");
    // 获取查询结果
    result=mysql_store_result(conn);
    my_ulonglong num =  mysql_num_rows(result);
    if(num == 0){
        printf(" no result!\n");
        pthread_mutex_unlock(&st.lock);
        return false;

    }


    mysql_free_result(result);
    pthread_mutex_unlock(&st.lock);

    printf("match found\n");
    return true;
}
